// src-tauri/src/main.rs
use serde_json::Value;
use std::io::{self, BufRead, BufWriter, Write};
use std::process::{Command, Stdio};
use std::sync::Mutex;
use tauri::{Manager, Runtime};

// 用Mutex包装子进程通信句柄（供多线程访问）
struct PythonComm {
    stdin: BufWriter<std::process::ChildStdin>,
    stdout: io::BufReader<std::process::ChildStdout>,
}
lazy_static::lazy_static! {
    static ref PYTHON_COMM: Mutex<Option<PythonComm>> = Mutex::new(None);
}

// 启动Python子进程
#[tauri::command]
fn start_python() -> Result<(), String> {
    let mut child = Command::new("python")
        .arg("path/to/your/python_script.py") // 你的Python脚本路径
        .stdin(Stdio::piped())
        .stdout(Stdio::piped())
        .stderr(Stdio::piped()) // 捕获错误输出（调试用）
        .spawn()
        .map_err(|e| format!("启动Python失败: {}", e))?;

    let stdin = BufWriter::new(child.stdin.take().ok_or("无法获取Python stdin")?);
    let stdout = io::BufReader::new(child.stdout.take().ok_or("无法获取Python stdout")?);

    // 保存通信句柄
    *PYTHON_COMM.lock().unwrap() = Some(PythonComm { stdin, stdout });

    // 启动线程：持续读取Python的输出，并转发给前端
    let app_handle = tauri::generate_context!().app_handle();
    tauri::async_runtime::spawn(async move {
        let mut comm = PYTHON_COMM.lock().unwrap();
        let Some(comm) = &mut *comm else {
            return;
        };

        for line in comm.stdout.lines() {
            match line {
                Ok(line) => {
                    // 解析Python发送的JSON消息
                    if let Ok(msg) = serde_json::from_str::<Value>(&line) {
                        // 通过Tauri IPC发送给前端（事件名："recognition_result"）
                        app_handle
                            .emit_all("recognition_result", msg)
                            .expect("发送给前端失败");
                    }
                }
                Err(e) => {
                    eprintln!("读取Python输出错误: {}", e);
                    break;
                }
            }
        }
    });

    Ok(())
}

// 停止Python子进程
#[tauri::command]
fn stop_python() -> Result<(), String> {
    let mut comm = PYTHON_COMM.lock().unwrap();
    if let Some(comm) = &mut *comm {
        // 发送停止命令给Python（可选，让Python优雅退出）
        writeln!(comm.stdin, "{}", json!({"cmd": "stop"}).to_string())
            .map_err(|e| format!("发送停止命令失败: {}", e))?;
        comm.stdin.flush()?;
    }
    *comm = None; // 释放句柄（子进程会自动退出）
    Ok(())
}

// Tauri入口配置
fn main() {
    tauri::Builder::default()
        .invoke_handler(tauri::generate_handler![start_python, stop_python])
        .run(tauri::generate_context!())
        .expect("运行Tauri应用失败");
}
